package IOBaseTest;

import java.io.*;
class MyBufferedInputStream {
    private InputStream in;//装饰模式，私有化成员变量
    private byte[] buf = new byte[1024];    //1,定义数组
    private int pos = 0, count = 0;         //2,定义指针pos、3,定义计数器count表示数组中剩余元素个数

    MyBufferedInputStream(InputStream in) {  //装饰类构造函数
        this.in = in;
    }

    public int myRead() throws IOException  //自定义字节流缓冲区read方法，一次读取一个字节，
    {
        if (count == 0) //计数器为0，则读取一个数组，开始计数
        {   //通过in对象读取硬盘上数据，存储到buf数组中
            count = in.read(buf);//read返回该数组中有效元素个数，到末尾返回-1
            if (count < 0) //健壮性判断、read到达文件末尾返回为-1
                return -1;
            pos = 0;    //执行到这一步说明有一个新的数组，初始化指针
            byte b = buf[pos];//通过指针获取字节数组元素
            count--;    //执行一次，元素有效个数-1
            pos++;      //指针位置右移
            return b & 255;   //该数组字节为byte,通过&与运算将其提升为int型并补上24个0返回  避免返回值为-1
        } else if (count > 0)    //计数器大于0，对数组继续读取就可以了
        {
            byte b = buf[pos];
            count--;
            pos++;
            return b & 0xff;  //16进制的255
        }
        return -1;
    }
}
class MyBufferedIOStream
{
    public static void main(String[] args)   
    {  
        System.out.println("Hello World!");  
    }   
}  